package cn.kow.kmall.service.impl;

import cn.kow.kmall.common.enums.ContentModuleTypeEnum;
import cn.kow.kmall.common.enums.KmallResultEnum;
import cn.kow.kmall.core.constant.KmallStatusConstant;
import cn.kow.kmall.core.exception.ServiceException;
import cn.kow.kmall.dao.ContentModuleImageRepository;
import cn.kow.kmall.dao.ContentModuleItemRepository;
import cn.kow.kmall.dao.ContentModuleKingkongRepository;
import cn.kow.kmall.dao.ContentModuleRepository;
import cn.kow.kmall.pojo.dto.*;
import cn.kow.kmall.pojo.entity.ContentModule;
import cn.kow.kmall.pojo.entity.ContentModuleImage;
import cn.kow.kmall.pojo.entity.ContentModuleItem;
import cn.kow.kmall.pojo.entity.ContentModuleKingkong;
import cn.kow.kmall.service.ContentService;
import org.springframework.beans.BeanUtils;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Author: lijun
 * @Description:
 * @Date: Created in 2020-03-05 11:14
 * @Modified By:
 */
@Service("contentService")
public class ContentServiceImpl implements ContentService {

    @Resource
    private ContentModuleRepository contentModuleRepository;

    @Resource
    private ContentModuleItemRepository contentModuleItemRepository;

    @Resource
    private ContentModuleKingkongRepository contentModuleKingkongRepository;

    @Resource
    private ContentModuleImageRepository contentModuleImageRepository;

    @Override
    public ContentModule getById(Long moduleId) {
        ContentModule contentModule = new ContentModule();
        contentModule.setId(moduleId);
        return contentModuleRepository.getOne(contentModule);
    }

    @Override
    public List<ContentModuleDTO> listModuleInfo() {
        ContentModule contentModule = new ContentModule();
        contentModule.setStatus(KmallStatusConstant.NORMAL);
        List<ContentModule> moduleList = contentModuleRepository.listAll(contentModule, Sort.by(Sort.Direction.ASC, "sort"));

        List<ContentModuleDTO> moduleDTOList = new ArrayList<>(moduleList.size());
        for (ContentModule module : moduleList) {
            ContentModuleDTO moduleDTO = new ContentModuleDTO();
            BeanUtils.copyProperties(module, moduleDTO);
            Long moduleId = module.getId();

            // 模块图片查询
            if (ContentModuleTypeEnum.BANNER.getType().equals(module.getModuleType())) {
                moduleDTO.setImageList(getModuleImageList(moduleId));
            }

            // 金刚位
            if (ContentModuleTypeEnum.KINGKONG.getType().equals(module.getModuleType())) {
                moduleDTO.setKingkongList(getModuleKingkongList(moduleId));
            }

            // 模块商品查询
            if (ContentModuleTypeEnum.SUBJECT.getType().equals(module.getModuleType())) {
                moduleDTO.setItemList(getModuleItemList(moduleId));
            }

            moduleDTOList.add(moduleDTO);
        }
        return moduleDTOList;
    }

    @Override
    public Page<ContentModule> listByPage(ContentQueryDTO queryDTO) {
        return contentModuleRepository.queryByPage(queryDTO);
    }

    @Override
    public List<ContentModule> listModuleByType(Integer moduleType) {
        ContentModule record = new ContentModule();
        record.setModuleType(moduleType);
        return contentModuleRepository.listAll(record);
    }

    @Override
    public List<ContentModuleImage> listModuleImage(Long moduleId) {
        ContentModuleImage record = new ContentModuleImage();
        record.setModuleId(moduleId);
        List<ContentModuleImage> imageList = contentModuleImageRepository.listAll(record);
        return imageList;
    }

    @Override
    public List<ContentModuleItem> listModuleItem(Long moduleId) {
        ContentModuleItem record = new ContentModuleItem();
        record.setModuleId(moduleId);
        List<ContentModuleItem> list = contentModuleItemRepository.listAll(record);
        return list;
    }

    @Override
    public List<ContentModuleKingkongDTO> listKingkong() {
        ContentModule record = new ContentModule();
        record.setModuleType(ContentModuleTypeEnum.KINGKONG.getType());
        ContentModule module = contentModuleRepository.getOne(record);
        if (null == module) {
            return null;
        }
        return getModuleKingkongList(module.getId());
    }

    @Override
    public void saveModuleImage(ContentModuleImageDTO imageDTO, String member) {
        Long id = imageDTO.getId();
        if (id != null && id != 0L) {
            ContentModuleImage moduleImage = contentModuleImageRepository.findById(id).orElseThrow(() -> new ServiceException(KmallResultEnum.DAO_NOT_FOUND));
            moduleImage.setLinkType(imageDTO.getLinkType());
            moduleImage.setLinkUrl(imageDTO.getLinkUrl());
            moduleImage.setPic(imageDTO.getPic());
            moduleImage.setSort(imageDTO.getSort());
            moduleImage.setStatus(imageDTO.getStatus());
            moduleImage.setRemark(imageDTO.getRemark());
            moduleImage.setUpdateBy(member);
            contentModuleImageRepository.update(moduleImage);
        } else {
            ContentModuleImage moduleImage = new ContentModuleImage();
            moduleImage.setModuleId(imageDTO.getModuleId());
            moduleImage.setLinkType(imageDTO.getLinkType());
            moduleImage.setLinkUrl(imageDTO.getLinkUrl());
            moduleImage.setPic(imageDTO.getPic());
            moduleImage.setSort(imageDTO.getSort());
            moduleImage.setRemark(imageDTO.getRemark());
            moduleImage.setStatus(imageDTO.getStatus());
            moduleImage.setCreateBy(member);
            contentModuleImageRepository.create(moduleImage);
        }
    }

    @Override
    public void saveModuleItem(ContentModuleItemDTO itemDTO, String member) {
        Long id = itemDTO.getId();
        if (id != null && id != 0L) {
            ContentModuleItem moduleItem = contentModuleItemRepository.findById(id).orElseThrow(() -> new ServiceException(KmallResultEnum.DAO_NOT_FOUND));
            moduleItem.setItemId(itemDTO.getItemId());
            moduleItem.setSort(itemDTO.getSort());
            moduleItem.setStatus(itemDTO.getStatus());
            moduleItem.setUpdateBy(member);
            contentModuleItemRepository.update(moduleItem);
        } else {
            ContentModuleItem moduleItem = new ContentModuleItem();
            moduleItem.setModuleId(itemDTO.getModuleId());
            moduleItem.setItemId(itemDTO.getItemId());
            moduleItem.setSort(itemDTO.getSort());
            moduleItem.setStatus(itemDTO.getStatus());
            moduleItem.setCreateBy(member);
            contentModuleItemRepository.create(moduleItem);
        }
    }


    @Override
    public void deleteModule(List<Long> ids) {
        contentModuleRepository.deleteAllById(ids);
    }

    @Override
    public void deleteModuleImage(List<Long> ids) {
        contentModuleImageRepository.deleteAllById(ids);
    }

    @Override
    public void deleteModuleItem(List<Long> ids) {
        contentModuleItemRepository.deleteAllById(ids);
    }

    private List<ContentModuleImageDTO> getModuleImageList(Long moduleId) {
        List<ContentModuleImage> imageList = contentModuleImageRepository.listByModuleId(moduleId);
        if (!CollectionUtils.isEmpty(imageList)) {
            List<ContentModuleImageDTO> imageDTOList = imageList.stream().map(a -> {
                ContentModuleImageDTO imageDTO = new ContentModuleImageDTO();
                BeanUtils.copyProperties(a, imageDTO);
                return imageDTO;
            }).collect(Collectors.toList());
            return imageDTOList;
        }
        return null;
    }

    private List<ContentModuleItemDTO> getModuleItemList(Long moduleId) {
        List<ContentModuleItem> itemList = contentModuleItemRepository.listByModuleId(moduleId);
        if (!CollectionUtils.isEmpty(itemList)) {
            List<ContentModuleItemDTO> itemDTOList = itemList.stream().map(a -> {
                ContentModuleItemDTO itemDTO = new ContentModuleItemDTO();
                BeanUtils.copyProperties(a, itemDTO);
                return itemDTO;
            }).collect(Collectors.toList());
            return itemDTOList;
        }
        return null;
    }

    private List<ContentModuleKingkongDTO> getModuleKingkongList(Long moduleId) {
        List<ContentModuleKingkong> kingkongListn = contentModuleKingkongRepository.listByModuleId(moduleId);
        if (!CollectionUtils.isEmpty(kingkongListn)) {
            List<ContentModuleKingkongDTO> dtoList = kingkongListn.stream().map(a -> {
                ContentModuleKingkongDTO kingkongDTO = new ContentModuleKingkongDTO();
                BeanUtils.copyProperties(a, kingkongDTO);
                return kingkongDTO;
            }).collect(Collectors.toList());
            return dtoList;
        }
        return null;
    }

}
